package persistencia;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Vector;

import com.mysql.jdbc.Statement;

import dominio.Articulo;
import dominio.Autor;
import dominio.Estado;
import dominio.Invitacion;
import dominio.Revision;
import dominio.Revisor;
import persistencia.EstadoDAO;

public class ArticuloDAO {

	public static Articulo newArticulo(int id) throws Exception{
		Articulo result = null;
		Vector<Autor> autores = new Vector<Autor>();		
		
		String SQL="Select titulo, fechaPublicacion, ruta, estadoUltimo from Articulo where id=?";
		String SQL2="Select esCorrespondingAutor, dniAutor, posicion from Articulo, ArticuloAutor where id=? and idArticulo=id order by posicion";
		
		Conexion bd=null;
		Exception ex=null;
		PreparedStatement p=null;
		try {
			bd=Broker.get().getBD();
			p=bd.prepareStatement(SQL);
			p.setInt(1, id);
			ResultSet r=p.executeQuery();
			result=new Articulo();
			if (r.next()) {
				result.setIdArticulo(id);
				result.setTitulo(r.getString("titulo"));
				result.setFechaPublicacion(r.getString("fechaPublicacion"));
				result.setRuta(r.getString("ruta"));
				result.setEstado(r.getString("estadoUltimo"));
				
			} else {
				throw new Exception("El art�culo con ID " + id + " no existe");
			}
			
			p=bd.prepareStatement(SQL2);
			p.setInt(1, id);
			r=p.executeQuery();
			if (r.next()) {
				if(r.getInt("esCorrespondingAutor")==1)
					result.setCorrespondingAutor(new AutorDAO().newAutor(r.getString("dniAutor")));
				autores.add(new AutorDAO().newAutor(r.getString("dniAutor")));
			} else {
				throw new Exception("El art�culo con ID " + id + " no existe");
			}

			result.setAutores(autores);

		}
		catch (Exception e) {
			ex=e;
		}
		finally {
			bd.close();
			if (ex!=null)
				throw ex;
		}
		
		return result;		
	}
	
	//COMPLETAR SET REVISORES Y SET RECOMENDACIONES
	
	/*public static Articulo setRevisores(int id) throws Exception{
		Articulo result = null;
		Vector<Revisor> revisores = new Vector<Revisor>();
		Vector<Revision> recomendaciones = new Vector<Revision>();
		
		
		String SQL="Select titulo, fechaPublicacion, estadoUltimo, ruta, dniAutor, esCorrespondingAutor, posicion, revisor, recomendacion " +
				"from Articulo, ArticuloAutor, RevisionArticulo  " +
				"where id=? and id='idArticulo' and id='articulo'";
		
		Conexion bd=null;
		Exception ex=null;
		PreparedStatement p=null;
		try {
			bd=Broker.get().getBD();
			p=bd.prepareStatement(SQL);
			p.setInt(1, id);
			ResultSet r=p.executeQuery();
			if (r.next()) {
				result=new Articulo();
				result.setIdArticulo(id);
				result.setTitulo(r.getNString("titulo"));
				result.setFechaPublicacion(r.getString("fechaPublicacion"));
				result.setRuta(r.getString("ruta"));
				result.setEstado(new EstadoDAO().newEstado(id, r.getString("estadoUltimo")));
				
				revisores.add(new RevisorDAO().newRevisor(r.getString("revisor")));
				recomendaciones.add(new RevisionDAO().newRevision(id, r.getString("revisor")));
			} else {
				throw new Exception("El art�culo con ID " + id + " no existe");
			}
			result.setRevisores(revisores);
			result.setRecomendaciones(recomendaciones);
		}
		catch (Exception e) {
			ex=e;
		}
		finally {
			bd.close();
			if (ex!=null)
				throw ex;
		}
		
		return result;		
	}*/
	
	public static void insert(Articulo articulo) throws Exception{
		insertarArticulo(articulo);
		insertarArticuloAutor(articulo);
	}
	
	private static void insertarArticulo(Articulo articulo) throws Exception{
		String SQL="Insert into Articulo (titulo, fechaPublicacion, estadoUltimo, ruta) values (?,?,?,?);";
		Conexion bd=null;
		Exception ex=null;
		PreparedStatement p=null;
		try {
			bd=Broker.get().getBD();
			p=bd.prepareStatement(SQL);
			p.setString(1, articulo.getTitulo());
			p.setString(2, articulo.getFechaPublicacion());
			p.setString(3, articulo.getEstado());
			p.setString(4, articulo.getRuta());
			int idR;
	
			p.executeUpdate();
			ResultSet rs=p.getGeneratedKeys();
			rs.next();
			idR=rs.getInt(1);
			articulo.setIdArticulo(idR);
			
		}
		catch (Exception e) {
			ex=e;
		}
		finally {
			bd.close();
			if (ex!=null)
				throw ex;
		}
	}
	
	private static void insertarArticuloAutor(Articulo articulo) throws Exception{
		String SQL="Insert into ArticuloAutor values (?,?,?,?)";
		Conexion bd=null;
		Exception ex=null;
		PreparedStatement p=null;
		try {
			bd=Broker.get().getBD();
			p=bd.prepareStatement(SQL);
			Autor correspondingAutor = articulo.getCorrespondingAutor();
			
			for(int i=0; i<articulo.getAutores().size(); i++){
				Autor autor=articulo.getAutores().elementAt(i);
				p.setInt(1, articulo.getIdArticulo());
				p.setString(2, autor.getDni());
				p.setInt(3, i);
				if(correspondingAutor.getDni().equals(autor.getDni()))
					p.setBoolean(4, true);
				else
					p.setBoolean(4, false);
				p.executeUpdate();
			}
		}
		catch (Exception e) {
			ex=e;
		}
		finally {
			bd.close();
			if (ex!=null)
				throw ex;
		}
	}
	
	public static void delete(Articulo articulo) throws Exception {
		String SQL="Delete from Articulo where id=?";
		Conexion bd=null;
		Exception ex=null;
		PreparedStatement p=null;
		try {
			bd=Broker.get().getBD();
			p=bd.prepareStatement(SQL);
			p.setInt(1, articulo.getIdArticulo());
			p.executeUpdate();
		}
		catch (Exception e) {
			ex=e;
		}
		finally {
			bd.close();
			if (ex!=null)
				throw ex;
		}	
	}
	
	public static void updateEstado(String estado, int idArticulo) throws Exception {
		Calendar today = new GregorianCalendar(); 
        SimpleDateFormat df = new SimpleDateFormat();
        df.applyPattern("dd/MM/yyyy");
		
		String SQL="UPDATE Articulo SET estadoUltimo=? where id= ?;";
		String SQL2=" INSERT INTO EstadoArticulo values (?,?,?);";
		Conexion bd=null;
		Exception ex=null;
		PreparedStatement p=null;
		try {
			bd=Broker.get().getBD();
			p=bd.prepareStatement(SQL2);
			p.setInt(1, idArticulo);
			p.setString(2, estado);
			p.setString(3, df.format(today.getTime()));
			p.executeUpdate();
			p=bd.prepareStatement(SQL);
			p.setString(1, estado);
			p.setInt(2, idArticulo);
			p.executeUpdate();
						
		}
		catch (Exception e) {
			ex=e;
		}
		finally {
			bd.close();
			if (ex!=null)
				throw ex;
		}
	}

	public static Vector<Articulo> getArticulosEstado(String estado) throws Exception{
		Vector<Articulo> articulos = new Vector<Articulo>();		
		
		String SQL="Select id from Articulo where estadoUltimo=?";
		
		Conexion bd=null;
		Exception ex=null;
		PreparedStatement p=null;
		try {
			bd=Broker.get().getBD();
			p=bd.prepareStatement(SQL);
			p.setString(1, estado);
			ResultSet r=p.executeQuery();
			while (r.next()) {
				articulos.add(newArticulo(r.getInt("id")));
			}
		}
		catch (Exception e) {
			ex=e;
		}
		finally {
			bd.close();
			if (ex!=null)
				throw ex;
		}
		
		return articulos;		
	}
	
	public static Vector<Articulo> getArticulosEstadoAutor(String estado,String dniAutor) throws Exception{
		Vector<Articulo> articulos = new Vector<Articulo>();		
		
		String SQL="Select id from Articulo,ArticuloAutor where dniAutor=? and esCorrespondingAutor=1 and estadoUltimo=? and ArticuloAutor.idArticulo=Articulo.id;";
		
		Conexion bd=null;
		Exception ex=null;
		PreparedStatement p=null;
		try {
			bd=Broker.get().getBD();
			p=bd.prepareStatement(SQL);
			p.setString(1, dniAutor);
			p.setString(2, estado);			
			ResultSet r=p.executeQuery();
			while (r.next()) {
				articulos.add(ArticuloDAO.newArticulo(r.getInt("id")));
			}
		}
		catch (Exception e) {
			ex=e;
		}
		finally {
			bd.close();
			if (ex!=null)
				throw ex;
		}
		
		return articulos;		
	}
	
	public static Vector<Revision> getArticulosEstadoAutorArticulo(String estado,String dniAutor,int idArt) throws Exception{
		Vector<Revision> revisiones = new Vector<Revision>();		
		
		String SQL="Select idArticulo, titulo, comentariosRevisor,comentariosEditor,revisor from RevisionArticulo,Articulo,ArticuloAutor where dniAutor=? and esCorrespondingAutor=1 and estadoUltimo=? and RevisionArticulo.articulo=Articulo.id and ArticuloAutor.idArticulo=Articulo.id and Articulo.id=?;";
		
		Conexion bd=null;
		Exception ex=null;
		PreparedStatement p=null;
		try {
			bd=Broker.get().getBD();
			p=bd.prepareStatement(SQL);
			p.setString(1, dniAutor);
			p.setString(2, estado);	
			p.setInt(3, idArt);
			ResultSet r=p.executeQuery();
			while (r.next()) {
				revisiones.add(RevisionDAO.newRevision(r.getInt("idArticulo"), r.getString("revisor")));
			}
		}
		catch (Exception e) {
			ex=e;
		}
		finally {
			bd.close();
			if (ex!=null)
				throw ex;
		}
		
		return revisiones;		
	}
	
	public static Vector<Articulo> getArticulosAutor(String idAutor) throws Exception{
		Vector<Articulo> articulos = new Vector<Articulo>();		
		
		String SQL="select id,titulo,STR_TO_DATE(fechaPublicacion,'%d/%m/%Y') AS date_format,estadoUltimo,ruta from ArticuloAutor,Articulo where idArticulo=id and dniAutor=? ORDER BY date_format DESC";
		
		Conexion bd=null;
		Exception ex=null;
		PreparedStatement p=null;
		try {
			bd=Broker.get().getBD();
			p=bd.prepareStatement(SQL);
			p.setString(1, idAutor);
			ResultSet r=p.executeQuery();
			while (r.next()) {
				Articulo a=new Articulo();
				a.setTitulo(r.getString("titulo"));
				a.setFechaPublicacion(r.getString("date_format"));
				a.setEstado(r.getString("estadoUltimo"));
				articulos.add(a);
			}
		}
		catch (Exception e) {
			ex=e;
		}
		finally {
			bd.close();
			if (ex!=null)
				throw ex;
		}
		
		return articulos;		
	}
	
	public static void updateRuta(String ruta, int idArticulo) throws Exception {
		Calendar today = new GregorianCalendar(); 
        SimpleDateFormat df = new SimpleDateFormat();
        df.applyPattern("dd/MM/yyyy");
		
		String SQL="UPDATE Articulo SET ruta=? where id= ?;";
		Conexion bd=null;
		Exception ex=null;
		PreparedStatement p=null;
		try {
			bd=Broker.get().getBD();
			p=bd.prepareStatement(SQL);
			p.setString(1, ruta);
			p.setInt(2, idArticulo);
			p.executeUpdate();
						
		}
		catch (Exception e) {
			ex=e;
		}
		finally {
			bd.close();
			if (ex!=null)
				throw ex;
		}
	}

}
